home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d18
/
turbotut.arc
/
MANUAL.EXE
/
lha
/
CHAP8.TXT
< prev
next >
Wrap
Text File
|
1988-11-27
|
12KB
|
256 lines
CHAPTER 8 - Scalars, subranges, and sets.
PASCAL SCALARS
A scalar, also called an enumerated type, is a list of
values which a variable of that type may assume. Look at
the Pascal program ENTYPES for an example of some scalars.
The first type declaration defines "days" as being a type
which can take on any one of seven values. Since, within
the VAR declaration, "day" is assigned the type of "days",
then "day" is a variable which can assume any one of seven
different values. Moreover "day" can be assigned the value
"mon", or "tue", etc. This makes the program easier to
follow and understand. Internally, Pascal does not actually
assign the value "mon" to the variable "day", but it uses an
integer representation for each of the names. This is
important to understand because you need to realize that you
cannot print out "mon", "tue", etc., but can only use them
for indexing control statements.
The second line of the type definition defines
"time_of_day" as another scalar which can have any of four
different values, namely those listed. The variable "time"
can only be assigned one of four values since it is defined
as the type "time_of_day". It should be clear that even
though it can be "morning", it cannot be assigned
"morning_time" or any other variant spelling of morning,
since it is simply another identifier which must have an
exact spelling to be understood by the compiler.
Several real variables are defined to allow us to
demonstrate the use of the scalar variables. After writing
a header for our output, the real variables are initialized
to some values that are probably not real life values, but
will serve to illustrate the scalar variable.
A BIG SCALAR VARIABLE LOOP
The remainder of the program is one large loop being
controlled by the variable "day" as it goes through all of
its values, one at a time. Note that the loop could have
gone from "tue" to "sat" or whatever portion of the range
desired, it does not have to go through all of the values of
"day". Using "day" as the case variable, the name of one of
the days of the week is written out each time we go through
the loop. Another loop controlled by "time" is executed
four times, once for each value of "time". The two CASE
statements within the inner loop are used to calculate the
total pay rate for each time period and each day. The data
is formatted carefully to make a nice looking table of pay
rates as a function of "time" and "day".
Page 35
CHAPTER 8 - Scalars, subranges, and sets.
Take careful notice of the fact that the scalar
variables never entered into the calculations, and they were
not printed out. They were only used to control the flow of
logic. It was much neater than trying to remember that "mon"
is represented by a 0, "tue" is represented by a 1, etc. In
fact, those numbers are used for the internal representation
of the scalars but we can relax and let Pascal worry about
the internal representation of our scalars.
LETS LOOK AT SOME SUBRANGES
Examine the program SUBRANGE for an example of
subranges. It may be expedient to define some variables
that only cover a part of the full range as defined in a
scalar type. Notice that "days" is declared a scalar type
as in the last program, and "work" is declared a type with
an even more restricted range. In the VAR declaration,
"day" is once again defined as the days of the week and can
be assigned any of the days by the program. The variable
"workday", however, is assigned the type "work", and can
only be assigned the days "mon" through "fri". If an
attempt is made to assign "workday" the value "sat", a
runtime error will be generated. A carefully written
program will never attempt that, and it would be an
indication that something is wrong with either the program
or the data. This is one of the advantages of Pascal over
older languages.
Further examination will reveal that "index" is assigned
the range of integers from 1 through 12. During execution
of the program, if an attempt is made to assign "index" any
value outside of that range, a run time error will be
generated. Suppose the variable "index" was intended to
refer to your employees, and you have only 12. If an
attempt was made to refer to employee number 27, or employee
number -8, there is clearly an error somewhere in the data
and you would want to stop running the payroll to fix the
problem. Pascal would have saved you a lot of grief.
SOME STATEMENTS WITH ERRORS IN THEM.
In order to have a program that would compile without
errors, and yet show some errors, the first part of the
program is not really a part of the program since it is
within a comment area. This is a trick to remember when you
are debugging a program, a troublesome part can be commented
out until you are ready to include it in the rest. The
errors are self explanatory.
There are seven assignment statements as examples of
subrange variable use. Notice that the variable "day" can
Page 36
CHAPTER 8 - Scalars, subranges, and sets.
always be assigned the value of either "workday" or
"weekend", but the reverse is not true because "day" can
assume values that would be illegal for the others.
THREE VERY USEFUL FUNCTIONS
The last section of the example program demonstrates the
use of three very important functions when using scalars.
The first is the "succ" function that returns the value of
the successor to the scalar used as an argument, that is the
next value. If the argument is the last value, a run time
error is generated. The next function is the "pred"
function that returns the predecessor to the argument of the
function. Finally the "ord" function which returns the
ordinal value of the scalar. All scalars have an internal
representation starting at 0 and increasing by one until the
end is reached. In our example program, "ord(day)" is 5 if
"day" has been assigned "sat", but "ord(weekend)" is 0 if
"weekend" has been assigned "sat". As you gain experience
in programming with scalars and subranges, you will realize
the value of these three functions.
A few more thoughts about subranges are in order before
we go on to another topic. A subrange is always defined by
two predefined constants, and is always defined in an
ascending order. A variable defined as a subrange type is
actually a variable defined with a restricted range, and
should be used as often as possible in order to prevent
garbage data. There are actually very few variables ever
used that cannot be restricted by some amount. The limits
may give a hint at what the program is doing and can help in
understanding the program operation. Subrange types can
only be constructed using the simple types, INTEGER, CHAR,
or scalar.
SETS
Now for a new topic, sets. Examining the example Pascal
program SETS will reveal some sets. A scalar variable is
defined first, in this case the scalar type named "goodies".
A set is then defined with the reserved words SET OF
followed by a predefined scalar type. Several variables are
defined as sets of "treat", after which they can
individually be assigned portions of the entire set.
Consider the variable "ice_cream_cone" which has been
defined as a set of type "treat". This variable is composed
of as many elements of "goodies" as we care to assign to it.
In the program, we define it as being composed of
"ice_cream", and "cone". The set "ice_cream_cone" is
therefore composed of two elements, and it has no numerical
Page 37
CHAPTER 8 - Scalars, subranges, and sets.
or alphabetic value as most other variables have.
Continuing in the program, you will see 4 more delicious
deserts defined as sets of their components. Notice that
the banana split is first defined as a range of terms, then
another term is added to the group. All five are combined
in the set named "mixed", then "mixed" is subtracted from
the entire set of values to form the set of ingredients that
are not used in any of the deserts. Each ingredient is then
checked to see if it is IN the set of unused ingredients,
and printed out if it is. Running the program will reveal a
list of unused elements.
In this example, better programming practice would have
dictated defining a new variable, possibly called
"remaining" for the ingredients unused. It was desirable to
illustrate that "mixed" could be assigned a value based on
subtracting itself from the entire set, so the poor variable
name was used.
This example resulted in some nonsense results but
hopefully it led your thinking toward the fact that sets can
be used for inventory control, possibly a parts allocation
scheme, or some other useful system.
SEARCHING WITH SETS
The Pascal program FINDCHRS is more useful than the last
one. In it we start with a short sentence and search it for
all lower case alphabetic letters and write a list of those
used. Since we are using a portion of the complete range of
CHAR, we do not need to define a scalar before defining the
set, we can define the set using the range 'a'..'z'. The
set "data_set" is assigned the value of no elements in the
first statement of the program, and the print string, named
"print_group", is set to blank in the next. The variable
"storage" is assigned the sentence to search, and the search
loop is begun. Each time through the loop, one of the
characters is checked. It is either declared as a non-
lower-case character, is a repeat of one already found, or
is a new one added to the list.
You are left to decipher the details of the program,
which should be no problem since there is nothing new here.
Run the program and observe how the list grows with new
letters as the sentence is scanned.
PROGRAMMING EXERCISE
1. Modify FINDCHRS to search for upper-case letters.
Page 38